﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using QldtSdh.BLL;
using QldtSdh.DAL.Models;
using QldtSdh.GUI.Utils;
using QldtSdh.Utils;

namespace QldtSdh.GUI.DuLieu
{
    public partial class FormQuanLyChuongTrinhDaoTao : QldtSdh.GUI.Common.BaseDialog
    {
        private TreeNode nodeKTC, nodeKTC_BB, nodeKTC_TC;
        private TreeNode nodeKTCS, nodeKTCS_BB, nodeKTCS_TC;
        private TreeNode nodeKTCN, nodeKTCN_BB, nodeKTCN_TC;
        private TreeNode nodeKLTN;
        private List<TreeNode> parentNodeList = new List<TreeNode>();

        private bool _DoNotUpdateGuiBySelectedCTDT = false;

        private ChuongTrinhDaoTao SelectedCTDT
        {
            get
            {
                ChuongTrinhDaoTao x = null;
                if (bsChuongTrinhDaoTao.Current != null)
                    x = bsChuongTrinhDaoTao.Current as ChuongTrinhDaoTao;
                return x;
            }
        }

        private void SetSelectedHocPhan(ChuongTrinhDaoTao_HocPhan hp)
        {
            if (hp == null)
            {
                btnHocPhanDaoTao_ChinhSua.Enabled = btnHocPhanDaoTao_Xoa.Enabled = false;
                propertyGridHocPhan.SelectedObject = null;
            }
            else
            {
                btnHocPhanDaoTao_ChinhSua.Enabled = btnHocPhanDaoTao_Xoa.Enabled = true;
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    var hocPhan = hp.HocPhan;//BizHocPhan.GetByID(hp.MaHocPhan, db);
                    HocPhan_PropertyGrid hocPhanProperty = null;
                    hocPhanProperty = new HocPhan_PropertyGrid()
                    {
                        MaHocPhan = hocPhan.MaHocPhan,
                        TenHocPhan = hocPhan.TenHocPhan,
                        HinhThucHoc = hocPhan.HinhThucHoc,
                        HinhThucThi = hocPhan.HinhThucThi,
                        DonViPhuTrach = BizDonViDaoTao.GetByID(hocPhan.MaDonViPhuTrachGUID, db).TenDonVi,
                        DiemQTHT = hocPhan.HeSoDiemQTHT.ToString(),
                        DiemThi = (100 - hocPhan.HeSoDiemQTHT).ToString(),
                        SoTinChi = hocPhan.SoTinChi.ToString(),
                        TongSoGio = hocPhan.TongSoGio.ToString(),
                        GhiChu = hocPhan.GhiChu
                    };
                    propertyGridHocPhan.SelectedObject = hocPhanProperty;
                }
            }
        }

        private ChuongTrinhDaoTao_HocPhan GetSelectedHocPhanAtTree()
        {
            var ctdt = this.SelectedCTDT;
            if (ctdt == null)
                return null;
            var node = treeCTDT.SelectedNode;
            if (node == null || node.Tag == null)
                return null;
            return node.Tag as ChuongTrinhDaoTao_HocPhan;
        }

        public FormQuanLyChuongTrinhDaoTao()
        {
            InitializeComponent();

            #region Khởi tạo cây
            treeCTDT.Nodes.Clear();
            var boldFont = new System.Drawing.Font(treeCTDT.Font, FontStyle.Bold);
            nodeKTC = new TreeNode(KHOIKIENTHUC_STRING.KIENTHUC_CHUNG.ToUpper(), 0, 0);
            nodeKTC.NodeFont = boldFont;
            nodeKTC_BB = new TreeNode("Học phần bắt buộc", 1, 1);
            nodeKTC_TC = new TreeNode(string.Format("Học phần tự chọn"), 2, 2);
            nodeKTC.Nodes.Add(nodeKTC_BB);
            nodeKTC.Nodes.Add(nodeKTC_TC);
            treeCTDT.Nodes.Add(nodeKTC);

            nodeKTCS = new TreeNode(KHOIKIENTHUC_STRING.KIENTHUC_COSO.ToUpper(), 0, 0);
            nodeKTCS.NodeFont = boldFont;
            nodeKTCS_BB = new TreeNode("Học phần bắt buộc", 1, 1);
            nodeKTCS_TC = new TreeNode(string.Format("Học phần tự chọn"), 2, 2);
            nodeKTCS.Nodes.Add(nodeKTCS_BB);
            nodeKTCS.Nodes.Add(nodeKTCS_TC);
            treeCTDT.Nodes.Add(nodeKTCS);

            nodeKTCN = new TreeNode(KHOIKIENTHUC_STRING.KIENTHUC_CHUYENNGANH.ToUpper(), 0, 0);
            nodeKTCN.NodeFont = boldFont;
            nodeKTCN_BB = new TreeNode("Học phần bắt buộc", 1, 1);
            nodeKTCN_TC = new TreeNode(string.Format("Học phần tự chọn"), 2, 2);
            nodeKTCN.Nodes.Add(nodeKTCN_BB);
            nodeKTCN.Nodes.Add(nodeKTCN_TC);
            treeCTDT.Nodes.Add(nodeKTCN);

            nodeKLTN = new TreeNode(KHOIKIENTHUC_STRING.KIENTHUC_KHOALUANTOTNGHIEP.ToUpper());
            nodeKLTN.NodeFont = boldFont;
            treeCTDT.Nodes.Add(nodeKLTN);
            parentNodeList = new List<TreeNode>() { nodeKTC_BB, nodeKTC_TC, nodeKTCS_BB, nodeKTCS_TC, nodeKTCN_BB, nodeKTCN_TC, nodeKLTN };
            foreach (var node in parentNodeList)
                node.NodeFont = boldFont;
            #endregion

            gridHocPhan.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridHocPhan.AddRowIndexing();

            // Nạp danh sách chương trình đào tạo
            _DoNotUpdateGuiBySelectedCTDT = true;
            bsChuongTrinhDaoTao.DataSource = BizChuongTrinhDaoTao.GetList();
            gridChuongTrinhDaoTao.SetDataSource(bsChuongTrinhDaoTao);
            HienThiSoChuongTrinh();
            _DoNotUpdateGuiBySelectedCTDT = false;
            UpdateGuiBySelectedCTDT();

            ActiveControl = treeCTDT;
        }

        private void btnChuongTrinhDaoTao_TaoMoi_Click(object sender, EventArgs e)
        {
            var dlg = new FormQuanLyChuongTrinhDaoTao_ChiTiet();
            dlg.OnChuongTrinhDaoTaoAdded += (ctdt) =>
            {
                bsChuongTrinhDaoTao.Add(ctdt);
                HienThiSoChuongTrinh();
            };
            dlg.ShowDialog();
        }

        private void HienThiSoChuongTrinh()
        {
            if (bsChuongTrinhDaoTao.Count == 0)
                lblThongKe.Text = "Chưa có chương trình đào tạo nào";
            else
                lblThongKe.Text = string.Format("Có {0} chương trình đào tạo", bsChuongTrinhDaoTao.Count);
        }

        private void btnHocPhanDaoTao_Them_Click(object sender, EventArgs e)
        {
            var ctdt = bsChuongTrinhDaoTao.Current as ChuongTrinhDaoTao;
            if (ctdt != null)
            {
                var dlg = new DuLieu.FormQuanLyChuongTrinhDaoTao_BoSungHocPhan(ctdt);
                dlg.OnHocPhanAdded += (hp) =>
                {
                    var lst = bsHocPhanDaoTao.DataSource as MySortableBindingList<ChuongTrinhDaoTao_HocPhan>;
                    bsHocPhanDaoTao.DataSource = null;
                    lst.Add(hp);
                    bsHocPhanDaoTao.DataSource = lst;

                    var stText = string.Format("{0} - {1}: {2}TC. Học kỳ: {3}",
                           hp._MaHocPhan, hp._TenHocPhan, hp._SoTinChi, hp.HocKy);
                    var nodeHocPhan = new TreeNode(stText, 3, 3);
                    nodeHocPhan.Tag = hp;

                    var parentNode = GetParentNodeOfHocPhanDaoTao(hp);
                    parentNode.Nodes.Add(nodeHocPhan);
                    CapNhatTextChoNodeNhomHocPhanTuChon(parentNode);
                };
                dlg.StartPosition = FormStartPosition.Manual;
                var bound = Screen.GetWorkingArea(this);
                dlg.Location = new Point() { X = bound.Right - dlg.Width - 4, Y = bound.Bottom - dlg.Height - 4 };
                dlg.ShowDialog();
            }
        }

        private void bsChuongTrinhDaoTao_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotUpdateGuiBySelectedCTDT) return;

            UpdateGuiBySelectedCTDT();
        }

        public void UpdateGuiBySelectedCTDT()
        {
            var ctdt = this.SelectedCTDT;
            if (ctdt != null)
            {
                btnHocPhanDaoTao_Import.Enabled = true;
                btnChuongTrinhDaoTao_ChinhSua.Enabled = true;
                btnChuongTrinhDaoTao_Xoa.Enabled = true;
                btnHocPhanDaoTao_Them.Enabled = true;

                txtKienThucChung.Text = ctdt.SoTinChiTuChonPhaiChonTrongPhanChung.ToString();
                txtKienThucCoSo.Text = ctdt.SoTinChiTuChonPhaiChonTrongPhanCoSo.ToString();
                txtKienThucChuyenNganh.Text = ctdt.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh.ToString();
            }
            else
            {
                btnHocPhanDaoTao_Import.Enabled = false;
                btnChuongTrinhDaoTao_ChinhSua.Enabled = false;
                btnChuongTrinhDaoTao_Xoa.Enabled = false;
                btnHocPhanDaoTao_Them.Enabled = false;

                txtKienThucChung.Text = txtKienThucCoSo.Text = txtKienThucChuyenNganh.Text = "";
            }

            NapDanhSachHocPhanCuaCTDT();
        }

        bool _DoNotSetSelectedTreeNodeBySelectedHocPhan = false;
        private void NapDanhSachHocPhanCuaCTDT()
        {
            _DoNotSetSelectedTreeNodeBySelectedHocPhan = true;
            var ctdt = this.SelectedCTDT;
            if (ctdt == null)
            {
                bsHocPhanDaoTao.DataSource = null;
                foreach (var node in parentNodeList)
                    node.Nodes.Clear();
                nodeKTC_TC.Text = "Học phần tự chọn";
                nodeKTCS_TC.Text = "Học phần tự chọn";
                nodeKTCN_TC.Text = "Học phần tự chọn";
                txtKienThucChung.Text = txtKienThucCoSo.Text = txtKienThucChuyenNganh.Text = "";
                lblCanhBaoKienThucChung.Visible = lblCanhBaoKienThucCoSo.Visible = lblCanhBaoKienThucChuyenNganh.Visible = false;

                gridHocPhan.SetDataSource(bsHocPhanDaoTao);
            }
            else
            {
                var lstHocPhan = BizChuongTrinhDaoTao_HocPhan.GetListWithHocPhanDetails(ctdt.MaChuongTrinhDaoTaoGUID);
                bsHocPhanDaoTao.DataSource = new MySortableBindingList<ChuongTrinhDaoTao_HocPhan>(lstHocPhan);

                foreach (var node in parentNodeList)
                    node.Nodes.Clear();
                foreach (var hp in lstHocPhan)
                {
                    var stText = string.Format("{0} - {1}: {2}TC. Học kỳ: {3}",
                        hp._MaHocPhan, hp._TenHocPhan, hp._SoTinChi, hp.HocKy);
                    var nodeHocPhan = new TreeNode(stText, 3, 3);
                    nodeHocPhan.Tag = hp;

                    TreeNode parentNode = GetParentNodeOfHocPhanDaoTao(hp);
                    parentNode.Nodes.Add(nodeHocPhan);
                }
                nodeKTC_TC.Tag = ctdt.SoTinChiTuChonPhaiChonTrongPhanChung;
                nodeKTCS_TC.Tag = ctdt.SoTinChiTuChonPhaiChonTrongPhanCoSo;
                nodeKTCN_TC.Tag = ctdt.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh;
                CapNhatTextChoNodeNhomHocPhanTuChon(nodeKTC_TC);
                CapNhatTextChoNodeNhomHocPhanTuChon(nodeKTCS_TC);
                CapNhatTextChoNodeNhomHocPhanTuChon(nodeKTCN_TC);

                gridHocPhan.SetDataSource(bsHocPhanDaoTao);

                treeCTDT.ExpandAll();
                treeCTDT.SelectedNode = treeCTDT.Nodes[0];
            }
            _DoNotSetSelectedTreeNodeBySelectedHocPhan = false;

            SetSelectedTreeNodeBySelectedHocPhan();
            UpdateGuiBySelectedTreeNode();
        }

        private void CapNhatTextChoNodeNhomHocPhanTuChon(TreeNode node)
        {
            if (node.Tag == null)
                return; // không phải là nhóm học phần tự chọn

            var nSoTCPhaiChon = Convert.ToInt32(node.Tag);
            var nTongSoTC = 0;
            foreach (TreeNode childNode in node.Nodes)
            {
                var hp = childNode.Tag as ChuongTrinhDaoTao_HocPhan;
                nTongSoTC += hp._SoTinChi;
            }
            node.Text = string.Format("Học phần tự chọn (chọn {0} trong {1}TC)", node.Tag, nTongSoTC);
            node.ForeColor = nSoTCPhaiChon > nTongSoTC ? Color.Red : SystemColors.ControlText;
        }

        private void btnChuongTrinhDaoTao_ChinhSua_Click(object sender, EventArgs e)
        {
            var ctdt = this.SelectedCTDT;
            if (ctdt != null)
            {
                var frm = new FormQuanLyChuongTrinhDaoTao_ChiTiet(ctdt);
                if (frm.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                {
                    bsChuongTrinhDaoTao.ResetCurrentItem();

                    // UpdateGuiBySelectedCTDT();
                    nodeKTC_TC.Tag = ctdt.SoTinChiTuChonPhaiChonTrongPhanChung;
                    nodeKTCS_TC.Tag = ctdt.SoTinChiTuChonPhaiChonTrongPhanCoSo;
                    nodeKTCN_TC.Tag = ctdt.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh;
                    CapNhatTextChoNodeNhomHocPhanTuChon(nodeKTC_TC);
                    CapNhatTextChoNodeNhomHocPhanTuChon(nodeKTCS_TC);
                    CapNhatTextChoNodeNhomHocPhanTuChon(nodeKTCN_TC);
                }
            }
        }

        private void btnChuongTrinhDaoTao_Xoa_Click(object sender, EventArgs e)
        {
            var ctdt = this.SelectedCTDT;
            if (ctdt != null)
            {
                if (DialogUtils.Confirmed("Bạn có chắc chắn muốn xoá chương trình đào tạo \"{0}\" không?", ctdt.TenChuongTrinhDaoTao))
                {
                    try
                    {
                        var oldPos = bsChuongTrinhDaoTao.Position;
                        BizChuongTrinhDaoTao.Delete(ctdt.MaChuongTrinhDaoTaoGUID);
                        bsChuongTrinhDaoTao.RemoveCurrent();
                        _DoNotUpdateGuiBySelectedCTDT = true;
                        if (oldPos > bsChuongTrinhDaoTao.Count - 1)
                            oldPos = bsChuongTrinhDaoTao.Count - 1;
                        _DoNotUpdateGuiBySelectedCTDT = false;
                        UpdateGuiBySelectedCTDT();
                    }
                    catch (Exception exc)
                    {
                        DialogUtils.ShowErrorWithDefaultTitle("Không thể xoá chương trình đào tạo được.\r\n" + exc.Message);
                    }
                }
            }
        }

        private void bsHocPhanDaoTao_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotSetSelectedTreeNodeBySelectedHocPhan)
                return;
            SetSelectedTreeNodeBySelectedHocPhan();
            UpdateGuiBySelectedTreeNode();
        }

        private void SetSelectedTreeNodeBySelectedHocPhan()
        {
            ChuongTrinhDaoTao_HocPhan hocPhan = null;
            if (bsHocPhanDaoTao.Current != null)
                hocPhan = bsHocPhanDaoTao.Current as ChuongTrinhDaoTao_HocPhan;

            _DoNotUpdateGuiBySelectedNode = true;
            try
            {
                if (hocPhan != null)
                {
                    TreeNode nodeParent = GetParentNodeOfHocPhanDaoTao(hocPhan);
                    foreach (TreeNode node in nodeParent.Nodes)
                        if (node.Tag != null)
                        {
                            var hp = node.Tag as ChuongTrinhDaoTao_HocPhan;
                            if (hp.MaHocPhan == hocPhan.MaHocPhan)
                            {
                                treeCTDT.SelectedNode = node;
                                return;
                            }
                        }

                    // Data in the tree is invalid!
                    treeCTDT.SelectedNode = treeCTDT.Nodes[0];
                }
                else
                {
                    // Data in the tree is invalid!
                    treeCTDT.SelectedNode = treeCTDT.Nodes[0];
                }
            }
            catch { }
            finally
            {
                _DoNotUpdateGuiBySelectedNode = false;
            }
        }

        private void btnHocPhanDaoTao_Xoa_Click(object sender, EventArgs e)
        {
            var ctdt = this.SelectedCTDT;
            var hp = this.GetSelectedHocPhanAtTree();
            if (hp != null)
            {
                if (DialogUtils.Confirmed("Bạn có chắc chắn muốn xoá học phần \"{0}\" khỏi chương trình đào tạo \"{1}\" không?",
                    hp._TenHocPhan, ctdt.TenChuongTrinhDaoTao))
                {
                    try
                    {
                        BizChuongTrinhDaoTao_HocPhan.DeleteHocPhan(hp.MaChuongTrinhDaoTaoGUID, hp.MaHocPhan);

                        //UpdateGuiBySelectedCTDT();
                        _DoNotSetSelectedTreeNodeBySelectedHocPhan = true;
                        var node = treeCTDT.SelectedNode;

                        var parentNode = node.Parent;
                        var newSelected = node.PrevNode;
                        if (newSelected == null)
                            newSelected = node.NextNode;
                        if (newSelected == null)
                            newSelected = parentNode;
                        parentNode.Nodes.Remove(node);
                        _DoNotSetSelectedTreeNodeBySelectedHocPhan = true;
                        try
                        {
                            var lst = bsHocPhanDaoTao.DataSource as MySortableBindingList<ChuongTrinhDaoTao_HocPhan>;
                            var oldPos = bsHocPhanDaoTao.Position;
                            bsHocPhanDaoTao.DataSource = null;
                            for (int i = 0; i < lst.Count; i++)
                            {
                                if (lst[i].MaHocPhan == hp.MaHocPhan)
                                {
                                    lst.RemoveAt(i);
                                    break;
                                }
                            }
                            bsHocPhanDaoTao.DataSource = lst;
                            if (oldPos > bsHocPhanDaoTao.Count - 1)
                                oldPos = bsHocPhanDaoTao.Count - 1;
                            if (oldPos >= 0)
                                bsHocPhanDaoTao.Position = oldPos;
                        }
                        catch { }
                        finally
                        {
                            _DoNotSetSelectedTreeNodeBySelectedHocPhan = false;
                        }
                        CapNhatTextChoNodeNhomHocPhanTuChon(parentNode);
                        treeCTDT.SelectedNode = newSelected;

                        if (this.GetSelectedHocPhanAtTree() == null)
                        {
                            if (bsHocPhanDaoTao.Current == null && bsHocPhanDaoTao.Count > 0)
                                bsHocPhanDaoTao.Position = 0;
                            SetSelectedTreeNodeBySelectedHocPhan();
                            UpdateGuiBySelectedTreeNode();
                        }
                    }
                    catch (Exception exc)
                    {
                        DialogUtils.ShowErrorWithDefaultTitle("Không thể xoá học phần khỏi chương trình đào tạo.\r\n" + exc.Message);
                    }
                }
            }
        }

        private bool _DoNotUpdateGuiBySelectedNode = false;
        private void treeCTDT_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (_DoNotUpdateGuiBySelectedNode)
                return;
            UpdateGuiBySelectedTreeNode();
        }

        private void UpdateGuiBySelectedTreeNode()
        {
            ChuongTrinhDaoTao_HocPhan hocPhan = null;
            TreeNode selectedNode = treeCTDT.SelectedNode;
            if (selectedNode != null && selectedNode.Tag != null && selectedNode.Tag is ChuongTrinhDaoTao_HocPhan)
                hocPhan = selectedNode.Tag as ChuongTrinhDaoTao_HocPhan;
            SetSelectedHocPhan(hocPhan);
        }

        TreeNode GetParentNodeOfHocPhanDaoTao(ChuongTrinhDaoTao_HocPhan hp)
        {
            TreeNode newParent = null;
            if (hp.KhoiKienThuc == (int)KHOIKIENTHUC.KIENTHUCCHUNG)
                newParent = hp.LaHocPhanBatBuoc ? nodeKTC_BB : nodeKTC_TC;
            else if (hp.KhoiKienThuc == (int)KHOIKIENTHUC.KIENTHUCCOSO)
                newParent = hp.LaHocPhanBatBuoc ? nodeKTCS_BB : nodeKTCS_TC;
            else if (hp.KhoiKienThuc == (int)KHOIKIENTHUC.KIENTHUCCHUYENNGANH)
                newParent = hp.LaHocPhanBatBuoc ? nodeKTCN_BB : nodeKTCN_TC;
            else
                newParent = nodeKLTN;
            return newParent;
        }

        private void btnHocPhanDaoTao_ChinhSua_Click(object sender, EventArgs e)
        {
            ChuongTrinhDaoTao_HocPhan hp = this.GetSelectedHocPhanAtTree();
            if (hp != null)
            {
                var dlg = new FormQuanLyChuongTrinhDaoTao_ChinhSuaHocPhan(hp);
                dlg.StartPosition = FormStartPosition.Manual;
                var bound = Screen.GetWorkingArea(this);
                dlg.Location = new Point() { X = bound.Right - dlg.Width - 4, Y = bound.Bottom - dlg.Height - 4 };
                TreeNode selectedNode = treeCTDT.SelectedNode;
                TreeNode oldParent = selectedNode.Parent;
                if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    _DoNotSetSelectedTreeNodeBySelectedHocPhan = true;
                    var newParent = GetParentNodeOfHocPhanDaoTao(hp);

                    selectedNode.Text = string.Format("{0} - {1}: {2}TC. Học kỳ: {3}",
                            hp._MaHocPhan, hp._TenHocPhan, hp._SoTinChi, hp.HocKy);
                    if (newParent != oldParent)
                    {
                        oldParent.Nodes.Remove(selectedNode);
                        newParent.Nodes.Add(selectedNode);
                        CapNhatTextChoNodeNhomHocPhanTuChon(oldParent);
                        CapNhatTextChoNodeNhomHocPhanTuChon(newParent);

                    }
                    treeCTDT.SelectedNode = selectedNode;
                    if (tabsHocPhanDaoTao.SelectedTab == tabKhoiKienThuc)
                    {
                        //var lstHocPhan = bsHocPhanDaoTao.DataSource as MySortableBindingList<ChuongTrinhDaoTao_HocPhan>;
                        bsHocPhanDaoTao.ResetBindings(false);
                    }
                    else
                    {
                        bsHocPhanDaoTao.ResetCurrentItem();
                    }
                    _DoNotSetSelectedTreeNodeBySelectedHocPhan = false;
                }
            }
        }

        private void tabsChuongTrinhDaoTao_HocPhan_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tabsHocPhanDaoTao.SelectedTab == tabKhoiKienThuc)
            {
                UpdateGuiBySelectedTreeNode();
            }
            else
            {
                #region tab xem theo học kỳ
                var hp = GetSelectedHocPhanAtTree();
                if (hp != null)
                {
                    #region đã chọn 1 học phần trên cây -> tô sáng đúng dòng tương ứng trên grid
                    _DoNotSetSelectedTreeNodeBySelectedHocPhan = true;
                    try
                    {
                        var lst = bsHocPhanDaoTao.DataSource as MySortableBindingList<ChuongTrinhDaoTao_HocPhan>;
                        for (int i = 0; i < lst.Count; i++)
                            if (lst[i].MaHocPhan == hp.MaHocPhan)
                            {
                                bsHocPhanDaoTao.Position = i;
                                break;
                            }
                    }
                    catch { }
                    finally
                    {
                        _DoNotSetSelectedTreeNodeBySelectedHocPhan = false;
                    }
                    #endregion
                }
                else
                {
                    #region trước đó không chọn học phần nào trên cây -> cho chọn học phần mặc định trong danh sách & update GUI
                    SetSelectedTreeNodeBySelectedHocPhan();
                    UpdateGuiBySelectedTreeNode();
                    #endregion
                }
                #endregion
            }
        }

        private void treeCTDT_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            btnHocPhanDaoTao_ChinhSua.PerformClick();
        }

        private void gridHocPhan_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (bsHocPhanDaoTao.Count > 0 && e.RowIndex >= 0)
                btnHocPhanDaoTao_ChinhSua.PerformClick();
        }

        private void btnHocPhanDaoTao_Import_Click(object sender, EventArgs e)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var frm = new FormQuanLyChuongTrinhDaoTao_Import(this.SelectedCTDT, db);
                frm.ShowDialog();
            }
        }
    }
}
